package com.hk.commons.util;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * @author Kevin
 */
@Getter
@RequiredArgsConstructor
public enum NumberChinese {

    /**
     * 0
     */
    ZERO('0', "零", "零"),

    /**
     * 1
     */
    ONE('1', "一", "壹"),

    /**
     * 2
     */
    TWO('2', "二", "贰"),

    /**
     * 3
     */
    THREE('3', "三", "叁"),

    /**
     * 4
     */
    FOUR('4', "四", "肆"),

    /**
     * 5
     */
    FIVE('5', "五", "伍"),

    /**
     * 6
     */
    SIX('6', "六", "陆"),

    /**
     * 7
     */
    SEVEN('7', "七", "柒"),

    /**
     * 8
     */
    EIGHT('8', "八", "捌"),

    /**
     * 9
     */
    NINE('9', "九", "玖"),

    /**
     * .
     */
    DOT('.', "点", "点");

    /**
     * 小写单位、数组元素位置不要变化，也不要增减元素
     */
    static final List<String> CN_UNIT = List.of("十", "百", "千", "万", "亿");

    /**
     * 大写单位、数组元素位置不要变化，也不要增减元素
     */
    static final List<String> CN_UNIT_CAPITALIZE = List.of("拾", "佰", "仟", "万", "亿");

    private final char value;

    private final String chinese;

    private final String chineseCapitalize;
//      20     19       18     17    16    15    14  13   12  11   10  9   8   7    6  5 4  3   2  1
// 千万万亿 百万万亿 十万万亿  万万亿 千万亿 百万亿 十万亿 万亿 千亿 百亿 十亿 亿 千万 百万 十万 万 千 百 十 个
// 十                   18                       14                 10              6           2
// 百           19                          15                  11               7            3
// 千   20                           16                    12               8              4
// 万                          17                     13                                5
// 亿                                                                    9

    private static final Map<Character, String> MAP;

    private static final Map<Character, String> MAP_CAPITALIZE;

    static {
        var values = NumberChinese.values();
        var maps = new HashMap<Character, String>(values.length);
        var capitalizeMaps = new HashMap<Character, String>(values.length);
        for (var item : values) {
            maps.put(item.getValue(), item.getChinese());
            capitalizeMaps.put(item.getValue(), item.getChineseCapitalize());
        }
        MAP = Collections.unmodifiableMap(maps);
        MAP_CAPITALIZE = Collections.unmodifiableMap(capitalizeMaps);
    }

    public static String getChineseByValue(char value) {
        return MAP.get(value);
    }

    public static String getChineseCapitalizeByValue(char value) {
        return MAP_CAPITALIZE.get(value);
    }

}
